home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / turbo_tk.arc / KEYTTT.PAS < prev    next >
Pascal/Delphi Source File  |  1988-02-01  |  6KB  |  251 lines

  1. {$S-,R-,V-,D-,T-}
  2. {\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\}
  3. {         TechnoJocks Turbo Toolkit v4.00            Released: Feb 1, 1987    }
  4. {                                                                             }
  5. {         Module: KeyTTT    --    keyboard and mouse input                    }
  6. {                                                                             }
  7. {                       Copyright R. D. Ainsbury (c) 1986                     }
  8. {\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\}
  9.  
  10. unit KeyTTT;
  11.  
  12. Interface
  13.  
  14. uses CRT, DOS;
  15.  
  16. type
  17.   Button = (NoB,LeftB,RightB,BothB);
  18.  
  19. var
  20.   Moused : boolean;
  21.   Horiz_Sensitivity : integer;
  22.  
  23.  
  24. Function  Mouse_Installed:Boolean;
  25. Procedure Show_Mouse_Cursor;
  26. Procedure Hide_Mouse_Cursor;
  27. Procedure Get_Mouse_Action(var But: button; var Hor,Ver: integer);
  28. Procedure Move_Mouse(Hor,Ver: integer);
  29. Procedure Confine_Mouse_Horiz(Left,Right:integer);
  30. Procedure Confine_Mouse_Vert(Top,Bot:integer);
  31. Procedure Set_Mouse_Cursor_Style(OrdChar: integer);
  32. Function  GetKey : Char;
  33. Procedure DelayKey(Time : integer);
  34.  
  35. Implementation
  36.  
  37. Function Mouse_Installed:Boolean;
  38. var
  39.   Reg: registers;
  40. begin
  41.     Reg.Ax := 0;
  42.     Intr($33,Reg);
  43.     Mouse_Installed :=  Reg.Ax <> 0;
  44. end; {Func Mouse_Installed}
  45.  
  46. Procedure Show_Mouse_Cursor;
  47. var
  48.   Reg: registers;
  49. begin
  50.     Reg.Ax := 1;
  51.     Intr($33,Reg);
  52. end; {Proc Show_Mouse_Cursor}
  53.  
  54. Procedure Hide_Mouse_Cursor;
  55. var
  56.   Reg : registers;
  57. begin
  58.     Reg.Ax := 2;
  59.     Intr($33,Reg);
  60. end; {Proc Hide_Mouse_Cursor}
  61.  
  62. Procedure Get_Mouse_Action(var But: button; var Hor,Ver: integer);
  63. var
  64.   Reg: registers;
  65. begin
  66.     with Reg do
  67.     begin
  68.         Ax := 3;
  69.         Intr($33,Reg);
  70.         Hor := Cx div 8;
  71.         Ver := Dx div 8;
  72.         {$B+}
  73.         If ((Bx and $1) <> $1)  and  ((Bx and $2) <> $2) then
  74.         begin
  75.             But := NoB;
  76.             exit;
  77.         end;
  78.         If ((Bx and $1) = $1)  and   ((Bx and $2) = $2) then
  79.            But := BothB
  80.         else
  81.         begin
  82.             If (Bx and $1) = $1 then
  83.                But := LeftB
  84.             else
  85.                But := RightB;
  86.         end;
  87.         {$B-}
  88.     end; {with}
  89. end;   {Get_Mouse_Action}
  90.  
  91. Procedure Move_Mouse(Hor,Ver: integer);
  92. var
  93.   Reg: registers;
  94. begin
  95.     Reg.Ax := 4;
  96.     Reg.Cx := pred(Hor*8);
  97.     Reg.Dx := pred(ver*8);
  98.     Intr($33,Reg);
  99. end; {Proc Move_mouse}
  100.  
  101. Procedure Confine_Mouse_Horiz(Left,Right:integer);
  102. var
  103.  Reg: registers;
  104. begin
  105.     Reg.Ax := 7;
  106.     Reg.Cx := pred(Left*8);
  107.     Reg.Dx := pred(Right*8);
  108.     Intr($33,Reg);
  109. end;
  110.  
  111. Procedure Confine_Mouse_Vert(Top,Bot:integer);
  112. var
  113.  Reg: registers;
  114. begin
  115.     Reg.Ax := 8;
  116.     Reg.Cx := pred(Top*8);
  117.     Reg.Dx := pred(Bot*8);
  118.     Intr($33,Reg);
  119. end;
  120.  
  121. Procedure Set_Mouse_Cursor_Style(OrdChar: integer);
  122. var
  123.   Reg: registers;
  124. begin
  125.    Reg.Ax := 10;
  126.    Reg.Bx := 0;        {software text cursor}
  127.    Reg.Cx := $7700;
  128.    Reg.Dx := $77 and OrdChar;
  129.    Intr($33,Reg);
  130. end;
  131.  
  132. Function GetKey:char;
  133. {waits for keypress or mouse activity}
  134. {Note that if an extended key is pressed e.g. F1, then a value of 128 is
  135.  added to the Char value. Also if a mouse is active the trapped mouse
  136.  activity is returned as follows:
  137.  
  138.                MouseUp    =  #128;
  139.                MouseDown  =  #129;
  140.                MouseLeft  =  #130;
  141.                MouseRight =  #131;
  142.                MouseEsc   =  #132;        right button
  143.                MouseEnter =  #133;        left button
  144. }
  145. Const
  146.  H = 40;
  147.  V = 13;
  148.  MouseUp    =  #128;
  149.  MouseDown  =  #129;
  150.  MouseLeft  =  #130;
  151.  MouseRight =  #131;
  152.  MouseEsc   =  #132;
  153.  MouseEnter =  #133;
  154. var
  155.   Action,
  156.   Finished : boolean;
  157.   Hor, Ver : integer;
  158.   B : button;
  159.   Ch : char;
  160. begin
  161.     Finished := false;
  162.     Action := false;
  163.     B := NoB;
  164.     If Moused then Move_Mouse(H,V);     {logically put mouse in middle of screen}
  165.     Repeat                      {keep checking Mouse for activity until keypressed}
  166.          If Moused then
  167.          begin
  168.              Get_Mouse_Action(B,Hor,Ver);
  169.              Case B of
  170.              LeftB : begin
  171.                          Ch := MouseEnter;
  172.                          Finished := true;
  173.                      end;
  174.              RightB: begin
  175.                          Ch := MouseEsc;
  176.                          Finished := true;
  177.                      end;
  178.              end; {case}
  179.              If (Ver - V) > 1 then
  180.              begin
  181.                  Ch := MouseDown;
  182.                  Finished := true;
  183.              end
  184.              else
  185.                 If (V - Ver) > 1 then
  186.                 begin
  187.                     Ch := MouseUp;
  188.                     Finished := true;
  189.                 end
  190.                 else
  191.                    If (Hor - H) > Horiz_Sensitivity then
  192.                    begin
  193.                        Ch := MouseRight;
  194.                        Finished := true;
  195.                    end
  196.                    else
  197.                       If (H - Hor) > Horiz_Sensitivity then
  198.                       begin
  199.                           Ch := MouseLeft;
  200.                           Finished := true;
  201.                       end;
  202.          end;
  203.          If Keypressed or finished then Action := true;
  204.     until Action;
  205.     If not finished then
  206.     begin
  207.         Ch := ReadKey;
  208.         Repeat
  209.              if Ch = #0 then
  210.              begin
  211.                  Ch := ReadKey;
  212.                  if Ord(Ch) > 127 then
  213.                     Ch := #0
  214.                  else
  215.                     Ch := Chr(Ord(Ch) + 128);
  216.              end;
  217.         Until Ch <> #0;
  218.     end;
  219.  
  220.     If finished and (Ch in [MouseEnter,MouseEsc]) then
  221.     begin
  222.         Delay(150);
  223.         Get_Mouse_Action(B,Hor,Ver);  {abbbsorb an mouse activity}
  224.     end;
  225.     GetKey := Ch;
  226. end;
  227.  
  228. Procedure DelayKey(Time : integer);
  229. var
  230.   I : Integer;
  231.   ChD : char;
  232. begin
  233.     I := 1;
  234.     While I < Time DIV 100 do
  235.     begin
  236.         Delay(100);
  237.         I := succ(I);
  238.         If Keypressed then
  239.         begin
  240.             I := MaxInt;
  241.             ChD := GetKey;           {absorb the keypress}
  242.         end;
  243.     end;
  244. end; {DelayKey}
  245.  
  246. begin   {unit initialization code}
  247.     Moused := Mouse_Installed;
  248.     If Moused then Horiz_Sensitivity := 1;
  249. end.
  250.  
  251.